﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Security.Permissions;
using LibreriaHelpers;
using LibreriaWeb;
using SistemaControlTraficoLibCommon;
using SistemaControlTraficoLibBusiness;
using SistemaControlTraficoLibDS;
using LibreriaWC;

[PrincipalPermission(SecurityAction.Demand, Authenticated = true, Role = Funciones.ViajeAdministrar)]
public partial class PanelControl : UserControlBase
{
    private boViaje viaje;
    private boReserva reserva;
    private boPrioridad prioridad;
    private boMovil movil;
    private boChofer chofer;
    protected void Page_Load(object sender, EventArgs e)
    {
        viaje = new boViaje(SessionHelper.GetSecurityInfo());
        reserva = new boReserva(SessionHelper.GetSecurityInfo());
        prioridad = new boPrioridad(SessionHelper.GetSecurityInfo());
        movil = new boMovil(SessionHelper.GetSecurityInfo());
        chofer = new boChofer(SessionHelper.GetSecurityInfo());

        if (!Page.IsPostBack)
        {
            ContenedorPadre.Titulo = "Panel de control";
            Inicializar();
            DDLHelper.CargarMovilesFaltantes(MovilID);
            DDLHelper.CargarChoferes(Choferid);

            CargarGrilla();
            CargarGrillaPrioridades();

            TabContainer1.ActiveTabIndex = 0;
        }
        HabilitarBotoneras();
    }

    private void CargarGrilla()
    {
        using (DataSet ds = reserva.FindByDay())
        {
            gvResultadosReservasConsolidado.DataSource = ds;
            gvResultadosReservasConsolidado.DataBind();
        }

        using (DataSet ds = viaje.FindByDayAbierto())
        {

            gvResultadosViajesConsolidado.DataSource = ds;
            gvResultadosViajesConsolidado.DataBind();
        }

        using (DataSet ds = viaje.FindByDay())
        {

            gvResultadosViajes.DataSource = ds;
            gvResultadosViajes.DataBind();
        }

        using (DataSet ds = reserva.FindByDay())
        {
            gvResultadosReservas.DataSource = ds;
            gvResultadosReservas.DataBind();
        }
    }
    private void CargarGrillaPrioridades()
    {
        using (DataSet ds = movil.FindByDisponible())
        {
            gvPrioridades.DataSource = ds;
            gvPrioridades.DataBind();
        }

        using (DataSet ds = movil.FindByDisponible())
        {

            gvPrioridadesConsolidado.DataSource = ds;
            gvPrioridadesConsolidado.DataBind();
        }

        using (DataSet ds = reserva.FindByDay())
        {
            gvResultadosReservas.DataSource = ds;
            gvResultadosReservas.DataBind();
        }

        using (DataSet ds = reserva.FindByDay())
        {
            gvResultadosReservasConsolidado.DataSource = ds;
            gvResultadosReservasConsolidado.DataBind();
        }
    }

    private void DeshabilitarBotoneras()
    {
        BotoneraConsolidado.Visible = false;
        BotoneraReserva.Visible = false;
        BotoneraPrioridad.Visible = false;
        BotoneraViaje.Visible = false;
    }

    private void HabilitarBotoneras()
    {
        DeshabilitarBotoneras();

        if (TabContainer1.ActiveTabIndex == 0)
        {
            BotoneraConsolidado.Visible = true;
            tmrRecargar.Enabled = true;
        }
        else if (TabContainer1.ActiveTabIndex == 1)
        {
            BotoneraReserva.Visible = true;
            tmrRecargar.Enabled = false;
        }
        else if (TabContainer1.ActiveTabIndex == 2)
        {
            BotoneraViaje.Visible = true;
            tmrRecargar.Enabled = false;
        }
        else if (TabContainer1.ActiveTabIndex == 3)
        {
            BotoneraPrioridad.Visible = true;
            tmrRecargar.Enabled = false;
        }
    }
    protected void gvResultadosReservas_SelectedIndexChanged(object sender, EventArgs e)
    {
        GridViewBase gv = (GridViewBase)sender;

        if (gv.ID == "gvResultadosReservasConsolidado")
        {
            int i = 0;

            while (i < gvResultadosReservas.Rows.Count && int.Parse(gvResultadosReservas.DataKeys[i][0].ToString()) != gvResultadosReservasConsolidado.ValorClaveInt32(0))
            {
                i++;
            }

            if (i < gvResultadosReservas.Rows.Count)
                gvResultadosReservas.SelectedIndex = i;
            else
                gvResultadosReservas.SelectedIndex = -1;
        }

        if (gvResultadosReservas.SelectedIndex != -1)
        {
            TabContainer1.ActiveTabIndex = 1;
            PanelaActualizacionReserva.Visible = true;
            DeshabilitarBotoneras();
            BotoneraReserva.Visible = true;
            btnGenerarViaje.Enabled = true;
            DDLHelper.CargarMovilesDisponiblesPorTipo(MovilIDReserva, 0);
        }
    }
    protected void gvResultadosReservasConsolidado_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        gvResultadosReservasConsolidado.SelectedIndex = e.RowIndex;
        reserva.Desactivar(gvResultadosReservasConsolidado.ValorClaveInt32(0));
        CargarGrilla();
    }
    protected void gvResultadosReservasConsolidado_PreRender(object sender, EventArgs e)
    {
        foreach (GridViewRow fila in gvResultadosReservasConsolidado.Rows)
        {
            fila.Cells[1].Attributes.Add("onclick", "return confirm('¿Está seguro que desea quitar la reserva?');");
        }
    }
    protected void gvResultados_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
    protected void gvResultadosViajes_PageIndexChanged(object sender, EventArgs e)
    {

    }
    protected void gvResultadosReservas_PageIndexChanged(object sender, EventArgs e)
    {

    }
    protected void gvResultadosReservas_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {

    }
    protected void gvResultadosViajes_SelectedIndexChanged(object sender, EventArgs e)
    {
        GridViewBase gv = (GridViewBase)sender;

        if (gv.ID == "gvResultadosViajesConsolidado")
        {
            int i = 0;

            while (i < gvResultadosViajes.Rows.Count && int.Parse(gvResultadosViajes.DataKeys[i][0].ToString()) != gvResultadosViajesConsolidado.ValorClaveInt32(0))
            {
                i++;
            }

            if (i < gvResultadosViajes.Rows.Count)
                gvResultadosViajes.SelectedIndex = i;
            else
                gvResultadosViajes.SelectedIndex = -1;

            if (gvResultadosViajes.SelectedIndex != -1)
            {
                TabContainer1.ActiveTabIndex = 2;
                Inicializar();
                PanelaActualizacionViaje.Visible = true;
                DeshabilitarBotoneras();
                BotoneraViaje.Visible = true;
                btnCerrarViaje.Enabled = true;
            }
        }
        else
        {
            int viajeEstadoID = gvResultadosViajes.ValorClaveInt32(1);
            if (viajeEstadoID == Constantes.ESTADO_VIAJE_ABIERTO)
            {
                Inicializar();
                PanelaActualizacionViaje.Visible = true;
                btnCerrarViaje.Enabled = true;
            }
        }
    }

    protected void gvResultadosViajesConsolidado_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        gvResultadosViajesConsolidado.SelectedIndex = e.RowIndex;
        viaje.Desactivar(gvResultadosViajesConsolidado.ValorClaveInt32(0));
        CargarGrilla();
        CargarGrillaPrioridades();
        DDLHelper.CargarMovilesFaltantes(MovilID);
    }
    protected void gvResultadosViajesConsolidado_PreRender(object sender, EventArgs e)
    {
        foreach (GridViewRow fila in gvResultadosViajesConsolidado.Rows)
        {
            fila.Cells[1].Attributes.Add("onclick", "return confirm('¿Está seguro que desea quitar el viaje?');");
        }
    }

    protected void gvResultadosViajes_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {

    }

    protected void gvResultadosViajes_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        GridViewBase gv = (GridViewBase)sender;

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DataRowView drv = (DataRowView)e.Row.DataItem;

            if (drv.Row["ViajeEstadoId"].ToString().Equals(Constantes.ESTADO_VIAJE_CERRADO.GetHashCode().ToString()))
            {
                //VER
            }
        }
    }

    protected void gvPrioridades_SelectedIndexChanged(object sender, EventArgs e)
    {
        GridViewBase gv = (GridViewBase)sender;

        if (gv.ID == "gvPrioridadesConsolidado")
        {
            gvPrioridades.SelectedIndex = gv.SelectedIndex;
        }

        int prioridadID = gvPrioridades.ValorClaveInt32();
        prioridad = new boPrioridad(SessionHelper.GetSecurityInfo());
        prioridad.Delete(prioridadID);

        CargarGrillaPrioridades();
        DDLHelper.CargarMovilesFaltantes(MovilID);
    }

    protected void vwBusqueda_Activate(object sender, EventArgs e)
    {
        CargarGrilla();
    }
    protected void btnAgregar_Click(object sender, EventArgs e)
    {
        dsPrioridad ds = null;
        dsPrioridad.PrioridadRow dr = null;

        if (Page.IsValid)
        {
            try
            {
                Control[] controles = new Control[] { 
                    MovilID, 
                    PrioridadFechaHora, 
                    Activo};

                ds = new dsPrioridad();
                dr = ds.Prioridad.NewPrioridadRow();
                Misc.FillRow(
                    ds.Prioridad,
                    dr,
                    controles);
                dr.PrioridadFechaHora = DateTime.Parse(PrioridadFechaHora.Text + " " + Hora.Text + ":" + Minuto.Text);
                ds.Prioridad.AddPrioridadRow(dr);

                prioridad = new boPrioridad(SessionHelper.GetSecurityInfo());
                prioridad.Update(ds);

                CargarGrillaPrioridades();
                DDLHelper.CargarMovilesFaltantes(MovilID);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (ds != null)
                {
                    ds.Dispose();
                }
            }
        }
    }

    protected void TabContainer1_ActiveTabChanged(object sender, EventArgs e)
    {
        CargarGrilla();
    }
    protected void btnGenerarViaje_Click(object sender, EventArgs e)
    {
        int reservaid = gvResultadosReservas.ValorClaveInt32(0);
        dsReserva dsreserva = null;
        dsReserva.ReservaRow drreserva = null;

        dsViaje dsviaje = null;
        dsViaje.ViajeRow drviaje = null;

        dsMovil dsmovil = null;
        dsMovil.MovilRow drmovil = null;

        //Recupero datos de la reserva
        dsreserva = reserva.Find(gvResultadosReservas.ValorClaveInt32(0));
        drreserva = (dsReserva.ReservaRow)dsreserva.Reserva.Rows[0];

        // Recupero los datos del movil seleccionado
        dsmovil = movil.Find(int.Parse(MovilIDReserva.SelectedValue));
        drmovil = (dsMovil.MovilRow)dsmovil.Movil.Rows[0];

        //Actualizo dr del viaje con datos de la reserva

        dsviaje = new dsViaje();
        drviaje = dsviaje.Viaje.NewViajeRow();

        drviaje.ViajeEstadoID = SistemaControlTraficoLibCommon.Constantes.ESTADO_VIAJE_ABIERTO;
        drviaje.ClienteID = drreserva.ClienteID;
        drviaje.MovilID = int.Parse(MovilIDReserva.SelectedValue);
        if (Choferid.SelectedValue != "0")
        {
            drviaje.ChoferID = int.Parse(Choferid.SelectedValue);
        }
        drviaje.MovilCostoHora = drmovil.MovilCostoHora;
        drviaje.MovilCostoPeon = drmovil.MovilCostoHoraPeon;
        drviaje.ViajeFechaHora = drreserva.ReservaFecha;
        drviaje.ViajeCantidadPeones = 0;
        drviaje.PartidoSalidaID = drreserva.PartidoSalidaID;
        drviaje.LocalidadSalidaID = drreserva.LocalidadSalidaID;
        drviaje.CalleSalidaID = drreserva.CalleSalidaID;
        if (!drreserva.IsReservaCalleAlturaSalidaNull())
        {
            drviaje.ViajeCalleAlturaSalida = drreserva.ReservaCalleAlturaSalida;
        }
        if (!drreserva.IsReservaPisoSalidaNull())
        {
            drviaje.ViajePisoSalida = drreserva.ReservaPisoSalida;
        }
        if (!drreserva.IsReservaDepartamentoSalidaNull())
        {
            drviaje.ViajeDepartamentoSalida = drreserva.ReservaDepartamentoSalida;
        }
        drviaje.PartidoLlegadaID = drreserva.PartidoLlegadaID;
        drviaje.LocalidadLlegadaID = drreserva.LocalidadLlegadaID;
        drviaje.CalleLlegadaID = drreserva.CalleLlegadaID;

        if (!drreserva.IsReservaCalleAlturaLlegadaNull())
        {
            drviaje.ViajeCalleAlturaLlegada = drreserva.ReservaCalleAlturaLlegada;
        }
        if (!drreserva.IsReservaPisoLlegadaNull())
        {
            drviaje.ViajePisoLlegada = drreserva.ReservaPisoLlegada;
        }
        if (!drreserva.IsReservaDepartamentoLlegadaNull())
        {
            drviaje.ViajeDepartamentoLlegada = drreserva.ReservaDepartamentoLlegada;
        }

        drviaje.ViajeImporte = 0;
        drviaje.ViajeBonificacionImporte = 0;
        drviaje.ViajeBonificacionPorcentaje = 0;
        drviaje.ViajeImporteFinal = 0;
        drviaje.Activo = true;
        drviaje.FechaAlta = DateTime.Now;
        drviaje.UsuarioAlta = SessionHelper.GetSecurityInfo().UsuarioId;
        drviaje.ReservaID = gvResultadosReservas.ValorClaveInt32(0);
        dsviaje.Viaje.AddViajeRow(drviaje);

        viaje.Update(dsviaje);

        // Actualizar tabla Prioridad

        dsPrioridad dsPrioridad = null;
        dsPrioridad.PrioridadRow drPrioridad = null;

        dsPrioridad = prioridad.FindByLibreByMovilId(Convert.ToInt32(MovilIDReserva.SelectedValue));
        drPrioridad = (dsPrioridad.PrioridadRow)dsPrioridad.Prioridad.Rows[0];
        drPrioridad["PrioridadAsignado"] = true;
        prioridad = new boPrioridad(SessionHelper.GetSecurityInfo());
        prioridad.Update(dsPrioridad);

        PanelaActualizacionReserva.Visible = false;
        
        CargarGrilla();
        CargarGrillaPrioridades();
    }

    protected void btnCalcular_Click(object sender, EventArgs e)
    {
        CalcularImporteFinal();
    }

    private void CalcularImporteFinal()
    {
        ViajeImporteFinal.Text = "0";

        if (ViajeImporte.EsNumeroDecimal)
            ViajeImporteFinal.Text = ViajeImporte.ToString();

        if (ViajeBonificacionImporte.EsNumeroDecimal)
            ViajeImporteFinal.Text = (ViajeImporte.Valor.Value - ViajeBonificacionImporte.Valor.Value).ToString();
        else if (ViajeBonificacionPorcentaje.EsNumeroDecimal)
            ViajeImporteFinal.Text = (ViajeImporte.Valor.Value - (ViajeImporte.Valor.Value * (ViajeBonificacionPorcentaje.Valor.Value / 100))).ToString();
    }


    protected void Inicializar()
    {
        Misc.InitializeControls(
            MovilID,
            ViajeFechaHoraFinalizacion,
            ViajeImporte,
            ViajeBonificacionImporte,
            ViajeBonificacionPorcentaje,
            ViajeImporteFinal);

        Activo.Checked = true;

        ViajeBonificacionImporte.Text = "0";
        ViajeBonificacionPorcentaje.Text = "0";

        btnCerrarViaje.Enabled = false;
        btnGenerarViaje.Enabled = false;
    }

    protected void btnCerrarViaje_Click(object sender, EventArgs e)
    {
        dsViaje ds = null;
        dsViaje.ViajeRow dr = null;

        Control[] controles = new Control[] { 
                    ViajeFechaHoraFinalizacion, 
                    ViajeImporte, 
                    ViajeBonificacionImporte, 
                    ViajeBonificacionPorcentaje, 
                    ViajeImporteFinal, 
                    Activo };

        //Ejecuta nuevamente este método por si el usuario presionó Calcular y luego modificó algún valor.
        CalcularImporteFinal();

        ds = viaje.Find(gvResultadosViajes.ValorClaveInt32());
        dr = (dsViaje.ViajeRow)ds.Viaje.Rows[0];
        Misc.FillRow(
            ds.Viaje,
            dr,
            controles);
        dr.ViajeFechaHoraFinalizacion = DateTime.Parse(ViajeFechaHoraFinalizacion.Text + " " + HoraFin.Text + ":" + MinutoFin.Text);
        dr.ViajeEstadoID = SistemaControlTraficoLibCommon.Constantes.ESTADO_VIAJE_CERRADO;
        viaje.Update(ds);

        //Actualizar tabla Prioridad

        dsPrioridad dsPrioridad = null;
        dsPrioridad.PrioridadRow drPrioridad = null;

        dsPrioridad = new dsPrioridad();
        drPrioridad = dsPrioridad.Prioridad.NewPrioridadRow();
        drPrioridad.MovilID = Convert.ToInt32(dr.MovilID);
        drPrioridad.PrioridadFechaHora = DateTime.Parse(ViajeFechaHoraFinalizacion.Text + " " + HoraFin.Text + ":" + MinutoFin.Text);
        drPrioridad.Activo = true;
        Misc.FillLog(drPrioridad);
        dsPrioridad.Prioridad.AddPrioridadRow(drPrioridad);
        prioridad = new boPrioridad(SessionHelper.GetSecurityInfo());
        prioridad.Update(dsPrioridad);

        PanelaActualizacionViaje.Visible = false;

        CargarGrillaPrioridades();
        CargarGrilla();
    }
    protected void MovilID_SelectedIndexChanged(object sender, EventArgs e)
    {
        PrioridadFechaHora.Text = DateTime.Today.ToShortDateString();
        Hora.SelectedValue = Tools.Hora(DateTime.Now.Hour, DateTime.Now.Minute);
        Minuto.SelectedValue = Tools.Minuto(DateTime.Now.Minute);
    }

    protected void btnAgregarReserva_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/Default.aspx?Modulo=Reserva&Origen=" + Constantes.ORIGEN_PANEL_CONTROL);
    }

    protected void btnAgregarViaje_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/Default.aspx?Modulo=Viaje&Origen=" + Constantes.ORIGEN_PANEL_CONTROL);
    }

    protected void tmrRecargar_Tick(object sender, EventArgs e)
    {
        CargarGrilla();
        CargarGrillaPrioridades();
    }

    protected void tmrProximosViajes_Tick(object sender, EventArgs e)
    {
        try
        {
            int cantidadReservas = reserva.FindProximosASalir();
            int cantidadViajes = viaje.FindProximosASalir();

            if (cantidadReservas != 0 || cantidadViajes != 0)
            {
                lblReservasProximasASalir.Text = "Hay " + cantidadReservas.ToString() + " reserva(s) próximas a salir.";
                lblViajesProximosASalir.Text = "Hay " + cantidadViajes.ToString() + " viaje(s) próximos a salir.";

                tblAviso.Visible = true;
                upAviso.Update();
            }
        }
        catch
        {
            tblAviso.Visible = false;
            upAviso.Update();
        }
    }

    protected void btnAviso_Click(object sender, EventArgs e)
    {
        tblAviso.Visible = false;
        upAviso.Update();
    }
}